<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>严格模式</title>
</head>

<body>
    <!-- 
    strict严格的 slack松散的
     -->
    <script>
        /* 变量提升：在变量被声明之前就已经能访问了（预解析造成的）（不科学） */
        // console.log(a);//undefined
        // var a = 123
        // console.log(a);

        /* 作用域穿透 */
        // if(true){
        //     var a = 123
        // }
        // // // a穿透了if的大括号（块级作用域）
        // console.log(a);

        /* 作用域穿透 */
        // for (var i = 0; i < 5; i++) {
        //     console.log(i);
        // }
        // // 循环以外本无i（ES5却有——不科学）
        // console.log(i);

        /* 开启严格模式=声明变量必须有var关键字 */
        // "use strict";
        // age = 123;//Uncaught ReferenceError: age is not defined
        // console.log(age);

        /* 开启严格模式=变量不允许重名 */
        // "use strict";
        // // Uncaught SyntaxError: Duplicate parameter name not allowed in this context
        // // 未捕获的 语法错误：重复的 参数名 不被允许 在当前上下文中
        // function fn(a, a) {
        //     console.log(a,a);
        // }
        // fn(1,2)

        /* 严格模式下不允许删除变量、对象、函数 */
        // "use strict";
        // var age = 123;
        // var obj = {a:"123"};
        // var fn = function (params) {};
        // // //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
        // delete age;
        // delete obj;
        // delete fn;
        // console.log(age,obj,fn);
        // // delete obj.a//delete的正常用法 删除对象的key
        // // console.log(obj,obj.a);

        /* 严格模式下不允许使用八进制 */
        // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
        // 未捕获的 语法错误: 八进制 语言 不被允许 在严格模式下
        // "use strict";
        // var bin = 0b111//二进制
        // var age = 017;//八进制
        // var hex = 0x17;//十六进制数
        // console.log(bin,age,hex);

        /* 严格模式禁止常规函数中的this指向window */
        "use strict";
        function fn(params) {
            // delete this.location
            console.log(this);//undefined
        }
        fn();

    </script>
</body>

</html>